package br.com.ff.usuario.session;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.ejb.Local;
import javax.ejb.Stateless;

import br.com.ff.common.exception.EntidadeDuplicadaException;
import br.com.ff.commons.session.Repositorio;
import br.com.ff.usuario.dao.UsuarioDAO;
import br.com.ff.usuario.entidade.Usuario;
import br.com.ff.usuario.session.UsuarioLocal;
import br.com.ff.usuario.to.UsuarioTO;

@Stateless
@Local(UsuarioLocal.class)
public class UsuarioSessionBean implements UsuarioLocal{

	@EJB
	Repositorio repositorio;
	
	UsuarioDAO usuarioDAO;
	
	@SuppressWarnings("unused")
	@PostConstruct
	private void inicializar() {
		usuarioDAO = repositorio.getUsuarioDAO();
	}	
	
	public void atualizar(UsuarioTO usuarioTO)
			throws EntidadeDuplicadaException {

		validarSalvar(usuarioTO);
		
		Usuario usuario = (Usuario)usuarioDAO.findById(
				Usuario.class, usuarioTO.getId());
		
		usuario.setDataExpirar(usuarioTO.getDataExpirar());
		usuario.setLogin(usuarioTO.getLogin());
		usuario.setStatus(usuarioTO.getStatus().getStatus());		
		
		if (!usuarioTO.getPassword().equals(usuario.getPassword())) {
			usuario.setPassword(usuarioTO.getPassword());
		}
		
		usuarioDAO.atualizar(usuario);
		
	}

	public UsuarioTO findById(Long id) {		
		Usuario usuario = (Usuario)usuarioDAO.findById(Usuario.class, id);
		UsuarioTO result = usuario.parseUsuarioTO();
		return result;
	}

	public List<UsuarioTO> findByParams(UsuarioTO usuarioTO) {
		
		List<Usuario> usuarios = usuarioDAO.findByParams(usuarioTO);
		
		List<UsuarioTO> result = new ArrayList<UsuarioTO>();
		for (Usuario usuario : usuarios) {
			result.add(usuario.parseUsuarioTO());
		}
		return result;
	}

	public void remover(Long id) {
		Usuario usuario = (Usuario)usuarioDAO.findById(Usuario.class, id);
		usuarioDAO.remover(usuario);
	}

	public boolean salvar(UsuarioTO usuarioTO)
			throws EntidadeDuplicadaException {
		
		validarSalvar(usuarioTO);
		
		Usuario usuario = new Usuario(usuarioTO);
		usuarioDAO.salvar(usuario);
		return true;
	}
	
	private void validarSalvar(UsuarioTO usuarioTO) throws EntidadeDuplicadaException {
		List<UsuarioTO> usuarios = findByParams(usuarioTO);
		
		if (!usuarios.isEmpty() &&
					(!usuarios.get(0).getId().equals(usuarioTO.getId()))) {
			throw new EntidadeDuplicadaException("Ja existe usuario: " + usuarioTO.getLogin());
		}
	}
}
